package com.xb.loan.cashier.biz.job;

import com.xb.loan.cashier.biz.dao.bean.CashierEncashBatch;
import com.xb.loan.cashier.biz.service.CashierEncashBatchService;
import com.xb.loan.cashier.biz.task.TaskManagerFactory;
import com.xb.loan.cashier.biz.task.ThirdQueryEncashTask;
import com.xb.loan.cashier.biz.task.alipay.AlipayWapQueryEncashTask;
import com.xb.loan.cashier.biz.util.Configure;
import com.xb.loan.cashier.service.constant.ICashierEnumConst;
import com.xb.loan.util.qrtz.task.AbstractCronTask;
import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Date;
import java.util.List;

/**
 * 监控数据库，将已发送且固定时间后()未接收到第三方通知的提现订单，加入TaskManager
 * 如果收银台需要部署多套，则在同一时间这个任务只能由其中一套执行
 */
public class EncashQueryJob extends AbstractCronTask {

    private static final Logger logger = LoggerFactory.getLogger(EncashQueryJob.class);
    private CashierEncashBatchService cashierEncashBatchService;
    private Date updateTime;
    
    @Override
    public void run() {
        //初始化处理类
        cashierEncashBatchService = getSpringBean("cashierEncashBatchService");
        
    	logger.info("提现结果查询任务---> EncashQueryJob开始启动....");
    	
    	//查询几个小时之前的提现文件结果
    	int hour = Configure.getIntValue("job.encashquery.updatetime");
    	updateTime = DateUtils.addHours(new Date(), -hour);
    	
    	//一次查询多少条记录
    	int pageSize = Configure.getIntValue("job.encashquery.pagesize");
    	
        List<CashierEncashBatch> batchs = null;
        
        while(true){
            
            //每次都查询从第一页开始，查询出来的记录会更新update_time记录为当前时间
            batchs = cashierEncashBatchService.selecSendingBatchsByUpdateTime(updateTime, 1 , pageSize);
            
            if(batchs == null || batchs.size() == 0){
            	logger.info("没有需要查询提现结果的批次");
                break;
            }
            
            ThirdQueryEncashTask task = null;
            
            for(CashierEncashBatch batch : batchs){
                
                if(batch.getPaychannelType() == ICashierEnumConst.CashierPayChannelType.ALIPAY.getType()){
                	logger.info("提现结果查询任务---> 批次："+batch.getBatchId() + "--> 开始");
                	
                    AlipayWapQueryEncashTask temp = getSpringBean("alipayWapQueryEncashTask");
                    temp.setCashierEncashBatch(batch);
                    
                    task = temp;
                }
                
                //更新批提现记录的更新时间为当前时间
                updateEncashBatchTime(batch.getBatchId());
                
                if(null == task){
                    logger.warn("Model={0} batchId={1} payChannelId={2} paychannelType={3} bankCodePlat={4} msg={5}", 
                            new Object[]{"cashier", batch.getBatchId(), batch.getPayChannelId(), batch.getPaychannelType(), batch.getBankCodePlat(), "任务类型不存在！"});
                    continue;
                }
                
                //存入提现查询任务线程池中处理提现
                TaskManagerFactory.getTaskManager(ICashierEnumConst.TaskManagerCode.ENCASH_QUERY).addTask(task);
            }
        }
        
        logger.info("提现结果查询---> EncashQueryJob结束....");
    }
    
    /**
     * 更新提现的更新时间为当前时间，避免并发处理一条记录太多次
     * 
     * @param batchId 更新的批次号
     * @author zheng.p
     * @date 2016年6月30日 下午4:31:12
     */
    private void updateEncashBatchTime(String batchId){
        CashierEncashBatch batch = new CashierEncashBatch();
        batch.setBatchId(batchId);
        batch.setUpdateTime(new Date());
        
        cashierEncashBatchService.updateByPrimaryKeySelective(batch);
    }
}
